//
//  ViewController.m
//  demoxx
//
//  Created by zxd on 2019/3/4.
//  Copyright © 2019 zxd. All rights reserved.
//

#import "ViewController.h"
#import <MyPromise.h>
#import "MyTableViewCell.h"

#import <PromiseKit.h>

#define WIDTH [UIScreen mainScreen].bounds.size.width

@interface ViewController ()


@end

@implementation ViewController

static inline void after(int delay ,void(^block)(void)){
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        block();
    });
}


- (void)viewDidLoad {
    [super viewDidLoad];

    [[MyPromise first:^(PassBlock  _Nonnull pass) {
        NSLog(@"1");
        after(3, ^{
            pass(@"111");
        });
    }].then(^(id  _Nonnull data, PassBlock  _Nonnull pass) {
        NSLog(@"2：接受值%@",data);
        after(1, ^{
            pass(@"222");
        });
    }).then(^(id  _Nonnull data, PassBlock  _Nonnull pass) {
        NSLog(@"3：接受值%@",data);
        after(4, ^{
            pass(@"333");
        });
    }).then(^(id  _Nonnull data, PassBlock  _Nonnull pass) {
        NSLog(@"4：接受值%@",data);
    }).catchError(^(NSError *err){
        NSLog(@"err");
    }) start];
    
    [MyPromise.first(^(PassBlock  _Nonnull pass) {
        
    }).then(^(id  _Nonnull data, PassBlock  _Nonnull pass) {
        
    }).then(^(id  _Nonnull data, PassBlock  _Nonnull pass) {
        
    }).catchError(^(NSError * _Nonnull err) {
        
    }) start];
    
    ////////////
    
    [AnyPromise promiseWithResolverBlock:^(PMKResolver _Nonnull resolver) {
        // 1、执行操作(支持异步)，并把得到的值通过resolver传递给下一个链式结构
        id valueObj;
        resolver(valueObj);
    }].thenOn(dispatch_get_main_queue(),^(id data){
        //2、data就是上个链式结构传过来的值：valueObj，拿到这个值以后可以进行其他操作，比如网络请求的等
        //如果要想把resolver事件携带结果值继续往下传，需要传入新的AnyPromis对象，否则没有继续传递值的resolver/adapter的block块
        return [AnyPromise promiseWithAdapterBlock:^(PMKAdapter  _Nonnull adapter) {
            id valueObj2;
            adapter(valueObj2 , nil);
        }];
    }).then(^(id data){
        // 3、 此时得到的data值就是步骤2传过来的新的值，如果步骤2并没有创建AnyPromise.AdapterBlock块，此时的值还是步骤1传过来的valueObj
        //以此同理，如若需要的值继续往下个链式结构模块传递或者需要改变新的值传递，参考步骤2
        // 所有的链式模块传递过程中出现错误error，会被抛出到catch，链式结构不再往下继续
    }).catch(^(NSError *err){
        // 发生错误被抛出。
    });
    
    
    
    
}




- (IBAction)reset:(id)sender {
   
}



- (IBAction)addCamear:(id)sender {
    
}



@end
